const {ipcRenderer, contextBridge} = require("electron");

contextBridge.exposeInMainWorld('electronAPI', {
    setSize: (size) => ipcRenderer.send('set-size', size),

    // TODO 渲染线程 ==>>  主线程
    login: async (code) => {
        return await ipcRenderer.invoke('login', code);
    },

    // TODO 渲染线程 ==>> 主线程
    logout: async (code) => {
        return await ipcRenderer.invoke('logout', code)
    },
    // TODO 渲染线程 ==>>  主线程
    getControl: async (data) => {
        return await ipcRenderer.invoke('control', data)
    },

    ws_SelectDeviceList: async (data) => {
        return await ipcRenderer.invoke('ws-select-device-list', data)
    },

    ws_InsertDevice: async (data) => {
        return await ipcRenderer.invoke('ws-insert-device', data)
    },
    ws_DeleteDevice: async (data) => {
        return await ipcRenderer.invoke('ws-delete-device', data)
    },
    ws_UpdateDevice: async (data) => {
        return await ipcRenderer.invoke('ws-update-device', data)
    },
    ws_msg_SelectMsgList: async (data) => {
        return await ipcRenderer.invoke('ws-msg-select-msg-list', data)
    },
    ws_msg_InsertMsg: async (data) => {
        return await ipcRenderer.invoke('ws-msg-insert-msg', data)
    },
    ws_msg_UpdateMsg: async (data) => {
        return await ipcRenderer.invoke('ws-msg-update-msg', data)
    },
    ws_msg_DeleteMsg: async (data) => {
        return await ipcRenderer.invoke('ws-msg-delete-msg', data)
    },

    changeWebsocket: async (data) => {
        return await ipcRenderer.invoke('change-websocket', data)
    },
    // changeWebsocket: (callback) => ipcRenderer.on('change-websocket', callback),

    // TODO 主线程 ==>>  渲染
    controlState: (callback) => ipcRenderer.on('control-state', callback),
    clearControlState: () => ipcRenderer.removeAllListeners('control-state'),

    // TODO 渲染 ==>>  主线程
    getForward: (data) => ipcRenderer.send('forward', data),


    // TODO 主线程 ==>>  渲染
    getOffer: (callback) => ipcRenderer.on('offer', callback),
    clearOffer: () => ipcRenderer.removeAllListeners('offer'),


    // TODO 渲染 ==>>  主线程
    getAnswer: (callback) => ipcRenderer.on('answer', callback),
    clearAnswer: () => ipcRenderer.removeAllListeners('answer'),


    // TODO 渲染 ==>>  主线程
    getScreenInfo: (callback) => ipcRenderer.on('screen-info', callback),
    clearScreenInfo: () => ipcRenderer.removeAllListeners('screen-info'),

    // TODO 主线程 ==>>  渲染
    getMasterCandidate: (callback) => ipcRenderer.on('master-candidate', callback),
    clearMasterCandidate: () => ipcRenderer.removeAllListeners('candidate'),


    getSlaveCandidate: (callback) => ipcRenderer.on('slave-candidate', callback),
    clearSlaveCandidate: () => ipcRenderer.removeAllListeners('slave-candidate'),


});


// 这段代码使用了 Electron 的 contextBridge API 来安全地在渲染进程和主进程之间传递数据。
// contextBridge 用于保护渲染进程免受恶意代码的影响，同时允许访问主进程的功能。
// 这段代码的作用是将两个方法暴露给渲染进程的全局 window 对象，以便在渲染进程中使用
//
//
// .on(event, listener): 用于添加事件监听器。当指定的事件发生时，注册的 listener 函数会被调用。用于处理异步事件和消息。
//
// .invoke(channel, ...args): 用于向主进程发送一个请求，并等待响应。这个方法返回一个 Promise，适用于需要从主进程获得结果的操作。
//
// .send(channel, ...args): 用于向主进程发送一个消息，但不会等待响应。适合于发送无需等待返回结果的通知或指令。
//
// 总结：
//
// 使用 .on 监听事件。
// 使用 .invoke 发送请求并接收结果。
// 使用 .send 发送通知或指令而不关心结果。。